#!/bin/bash

# PM2启动脚本
# 用于在生产环境中使用PM2启动Node.js应用

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log() {
    echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}

log_error() {
    echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}

# 检查PM2是否安装
check_pm2() {
    if ! command -v pm2 &> /dev/null; then
        log_error "PM2未安装，请先安装PM2: npm install -g pm2"
        exit 1
    fi
    log_success "PM2已安装"
}

# 检查应用是否已构建
check_build() {
    if [ ! -d "dist" ]; then
        log_error "应用未构建，请先运行: npm run build"
        exit 1
    fi
    log_success "应用已构建"
}

# 创建日志目录
create_log_dir() {
    if [ ! -d "logs" ]; then
        mkdir -p logs
        log "创建日志目录: logs"
    fi
}

# 停止现有的PM2进程
stop_existing() {
    log "检查现有PM2进程..."
    if pm2 list | grep -q "xy-user-system"; then
        log "停止现有应用..."
        pm2 stop xy-user-system
        pm2 delete xy-user-system
        log_success "已停止现有应用"
    else
        log "没有发现现有的PM2进程"
    fi
}

# 启动应用
start_app() {
    log "使用PM2启动应用..."
    pm2 start ecosystem.config.js --env production
    log_success "应用启动成功"
}

# 保存PM2配置
save_pm2() {
    log "保存PM2配置..."
    pm2 save
    log_success "PM2配置已保存"
}

# 设置PM2开机自启
setup_startup() {
    log "设置PM2开机自启..."
    pm2 startup
    log_warning "请按照上面的提示运行sudo命令来完成开机自启设置"
}

# 显示状态
show_status() {
    log "应用状态:"
    pm2 list
    pm2 logs xy-user-system --lines 10
}

# 主函数
main() {
    log "开始使用PM2启动应用..."
    
    check_pm2
    check_build
    create_log_dir
    stop_existing
    start_app
    save_pm2
    setup_startup
    show_status
    
    log_success "PM2启动完成！"
    log "常用PM2命令:"
    log "  查看状态: pm2 list"
    log "  查看日志: pm2 logs xy-user-system"
    log "  重启应用: pm2 restart xy-user-system"
    log "  停止应用: pm2 stop xy-user-system"
    log "  删除应用: pm2 delete xy-user-system"
}

# 执行主函数
main